package com.hy;

/**
 * Created With IntelliJ IDEA.
 * Descriptions:盛最多水的容器
 *
 * 给定一个长度为 n 的整数数组 height 。有 n 条垂线，第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
 * 找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。
 * 返回容器可以储存的最大水量。
 *
 * 说明：你不能倾斜容器。
 * User:Mr.Du
 * Date:2024/8/17
 * Time:16:11
 */
public class MaxArea {

    /**
     * 计算最大容器面积
     *
     * @param height 一个整数数组，表示容器的边高
     * @return 返回能装下的最大水量
     */
    public int maxArea(int[] height) {
        // 初始化左右指针
        int l = 0, r = height.length - 1;
        // 初始化结果和临时最大值
        int res = 0, max = 0;
        // 当左指针小于右指针时，执行循环
        while(l < r){
            // 更新结果为当前结果和临时最大值中的较大者
            res = Math.max(res, max);
            // 判断右边指针和左边指针的高度，决定移动哪个指针
            if(height[r] < height[l]){
                // 如果右边指针的高度小于左边指针的高度，则移动右指针
                max = height[r] * (r - l);
                // 移动右指针直到找到一个更高的柱子
                while(l < --r && height[r] < height[r+1]);
            } else {
                // 如果左边指针的高度小于等于右边指针的高度，则移动左指针
                max = height[l] * (r - l);
                // 移动左指针直到找到一个更高的柱子
                while(++l < r && height[l] < height[l-1]);
            }
            // 更新结果为当前结果和临时最大值中的较大者
            res = Math.max(res, max);
        }
        // 返回最大水量
        return res;
    }

    public int maxArea1(int[] height) {
        int l = 0, r = height.length - 1;
        int res = 0, max = 0;
        while(l < r){
            max = Math.min(height[r], height[l]) * (r - l);
            res = Math.max(res, max);
            if(height[r] < height[l]){
                while(l < --r && height[r] < height[r+1]);
            }else{
                while(++l < r && height[l] < height[l-1]);
            }
        }
        return res;
    }
}
